Показ дописів із міткою FreeBSD. Показати всі дописи
Показ дописів із міткою FreeBSD. Показати всі дописи

понеділок, 22 серпня 2011 р.

Ноутбучная вебкамера

Таки уже работает. Необходимо: cuse4bsd и webcamd . Если фря достаточно новая, то даже в net-im/skype работает

четвер, 13 січня 2011 р.

Языкатые вопросы

А носители языка понимают разницу между exit и quit? Я вот не вижу никакой.
А получается весело: многие программы понимают обе комманды, некоторые понимают только одну из них (например gdb понимает только quit, а nslookup понимает тольок exit).
Но есть и совершенно яркие случаи: в консоли управления mpd (который Multi-link PPP daemon for FreeBSD) exit - Exit console (выход из консоли управления), а quit - Quit program (завершение работы демона)

четвер, 4 листопада 2010 р.

ipfw vs pf: удобство синтаксиса

Многие взлюбили pf за наличие кучи приятных плюшек в конфиге. Вот только иногда люди забывают (или даже не знают), что большинство этих плюшек реализуются не собственно фаерволлом, а утилитой pfctl, которая транслирует конфиг при загрузке. А это: переменные, возможность вместо адреса или сети указывать "адрес (или сеть) с такого то интерфейса", возможность практически в любом месте правила вместо одного элемента указать список (в фигурных скобках).
"Ну и что?" скажут некоторые. А то, что, во первых, без четкого понимания что это всего лишь syntax sugar, реализуемый pfctl, часто можно оказаться обманутым и получить не то, что ожидалось. Напримерь кусок "from em0:network" это на самом деле не "от адресов с сетей, которые установлены на em0", а "от адресов с сетей, который былы установлены на em0 в момент загрузки правил". А правило "block in from not { 192.168.0.0/16, 10.0.0.0/8 }" на самом деле оттранслируется в два: "block in from not 192.168.0.0/16" и "block in from not 10.0.0.0/8" и в результате заблокирует весь трафик, а не трафик от сетей, кроме перечисленных.
"Ну и пусть! Все-равно же удобно! А в ipfw такого нет". Или есть?
Ну, во первых некоторые вещи в ipfw просто не нужны, потому что изначально есть правильные элементы: есть "me" вместо костыля "table <me> { self; }", есть "allow ip from { x or not y or z } to any" (причем и то, и то это элементы фаерволла, а не препроцессора), есть возможность задавать через запятую список сетей или вообще "1.2.3.0/24{128,35-55,89}"
Ну а во вторых все-равно хочется переменных и т.п., пусть и это будет транслироваться на этапе загрузки? Ну так вот же: -p . И вот так оно включается
firewall_enable="YES"
firewall_type="/etc/ipfw.conf.m4"
firewall_flags="-p /usr/bin/m4"
firewall_nat_enable="YES"
А вот так используется:
define(`ext_if',`vlan3')
define(`nat_ip',`100.100.100.20')
define(`rfc1918',`10.0.0.0/8, 172.16/12, 192.168/16')
define(`mailserviceip',`100.100.100.29')
define(`mailerip',`10.1.2.102')

nat 1 config ip nat_ip same_ports log
add nat 1 all from 10.0.0.0/8 to any out xmit ext_if
add deny all from rfc1918 to any out xmit ext_if

add nat 1 all from any to nat_ip in recv ext_if

add fwd mailerip,imaps tcp from any to mailserviceip imaps in

вівторок, 12 жовтня 2010 р.

Advanced disk format on FreeBSD

Вот такой вот свой маленький велосипедик получился:
# cat /etc/rc.d/gnop 
#!/bin/sh
#

# PROVIDE: gnop
# REQUIRE: mountcritlocal
# BEFORE:  zfs
# KEYWORD: nojail

. /etc/rc.subr

name="gnop"
rcvar=`set_rcvar`
start_cmd="do_gnop"
stop_cmd=":"

do_gnop()
{
        for d in $gnop_disks
        do
                if [ -e /dev/$d.nop ]
                then
                        echo "gnop: device $d already configured"
                else
                        echo -n "gnop: configuring device $d ..."
                        gnop create -v $gnop_flags $d
                fi
        done
}

load_rc_config $name
run_rc_command "$1"
# fgrep gnop /etc/rc.conf
gnop_enable="YES"
gnop_disks="ada0 ada1 ada2 ada3"
gnop_flags="-S 4096"

вівторок, 21 вересня 2010 р.

Вот тут будет домашняя файлосвалка

# zpool list
NAME     SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
zstore  7.25T   776K  7.25T     0%  ONLINE  -
zusb    3.59G  2.41G  1.19G    66%  ONLINE  -
# zpool status zstore
  pool: zstore
 state: ONLINE
 scrub: none requested
config:

        NAME           STATE     READ WRITE CKSUM
        zstore         ONLINE       0     0     0
          raidz1       ONLINE       0     0     0
            gpt/disk1  ONLINE       0     0     0
            gpt/disk2  ONLINE       0     0     0
            gpt/disk3  ONLINE       0     0     0
            gpt/disk4  ONLINE       0     0     0

errors: No known data errors
# sudo camcontrol devlist
<WDC WD20EARS-00MVWB0 51.0AB51>    at scbus0 target 0 lun 0 (ada2,pass2)
<WDC WD20EARS-00MVWB0 51.0AB51>    at scbus1 target 0 lun 0 (ada0,pass0)
<WDC WD20EARS-00MVWB0 51.0AB51>    at scbus2 target 0 lun 0 (ada1,pass1)
<WDC WD20EARS-00MVWB0 51.0AB51>    at scbus3 target 0 lun 0 (ada3,pass6)
< USB DISK 2.0 PMAP>               at scbus4 target 0 lun 0 (pass3,da0,sg0)
<Generic- SD/MMC 1.00>             at scbus5 target 0 lun 0 (pass4,da1,sg1)
<Generic- MS/MS-Pro 1.00>          at scbus5 target 0 lun 1 (pass5,da2,sg2)

неділя, 12 вересня 2010 р.

Доклад на kyivbsd.org.ua

Уговорили чего-нибудь расказать про рабочий кластер (доклад так и назван: FreeBSD cluster). Хотя я и долго сопротивлялся, потому как считаю что ничего особенного там нет.
Так что в комментариях принимаю предварительные вопросы, на которые вы хотели бы услышать ответы по данной теме. Если смогу что ответить, то включу в доклад

субота, 11 вересня 2010 р.

Обычное рабочее окружение на обычной рабочей станции

$ ps -xo comm|sort|uniq -c|sort -n
   1 COMMAND
   1 dbus-daemon
   1 dbus-launch
   1 firefox-bin
   1 gconfd-2
   1 openbox
   1 osd_clock
   1 osdmixer
   1 ps
   1 ssh-agent
   1 synergys
   1 thunderbird-bin
   1 xautolock
   1 xbindkeys
   1 xearth
   1 xxkb
   6 sh
   9 skype
  30 ssh
  33 xterm
  33 zsh

пʼятниця, 10 вересня 2010 р.

named in jail

Скрипт запуска named в базовой системе FreeBSD по умолчанию запускает его в chroot /var/named . Для своей работы named-у нужен /dev/null и /dev/random , поэтому этот же скрипт запуска монтирует в chroot devfs с рулесетами, оставляющими только эти устройства. Естественно в jail подобный фокус не получится ввиду того, что по умолчанию в jail вообще запрещен mount, и разрешить его можно только для определенных "jail-friendly file systems"
Выходов 3:
  1. не запускать named в jail :)
  2. выключить chroot, выставив named_chrootdir=""
  3. предварительно подготовить dev/ для named: стартовый скрипт при запуске внутри jail не пытается сам примонтировать devfs, а проверяет не примонтирован ли он уже для него.
Вообще наличие 3-го пункта (благодаря r188293) намекает на наличие какой-то "стандартной" процедуры делать это предварительное монтирование, но я эту процедуру не нашел. Поэтому соорудил сам:
jail_levsha_named_dev="${jail_levsha_rootdir}/var/named/dev"
jail_levsha_exec_prestart0="devfs_domount ${jail_levsha_named_dev} devfsrules_hide_all"
jail_levsha_exec_prestart1="devfs -m ${jail_levsha_named_dev} rule apply path null unhide"
jail_levsha_exec_prestart2="devfs -m ${jail_levsha_named_dev} rule apply path random unhide"
jail_levsha_exec_poststop0="umount ${jail_levsha_named_dev}"

вівторок, 17 серпня 2010 р.

htpc & nas & router: OS

Ввиду моих личный предпочтений на железку была установлена FreeBSD, причем на usb flash, причем current, причем amd64, причем на gpt & zfs :)
На самом деле понятно что в current необходимости нет. Я его выбрал из соображений потенциального полигона для покрутить/потестировать и из соображений что в current уже ZFSv15.
В amd64 тоже необходимости нет: не смотря на то, что в материнку можно установить до 4GB оперативной памяти, видеться системой будет только чуть больше трех:
hw.physmem: 3460689920
Я выбрал amd64 из соображений чтобы на ноуте и медиабоксе была одна архитектура - потенциально это позволит в будущем использовать firewire для дебага.
На материнской плате есть только 4 sata разъема, поэтому отдельный системный диск не поставишь. А ставить систему на диски с данными не хотелось. Поэтому было решено использовать usb flash (уж usb портов полно, с большим запасом).
На дисках с данными планируется использовать zfs (в режиме raidz). Это один из пунктов, почему на системной флешке тоже используется zfs: ввиду того, что zfs в данный момент достаточно плохо интегрирован в систему распределения памяти freebsd, не рекомендуется использовать на одном компьютере и zfs, и ufs одновременно. Кроме того использование zfs на системной флешке избавляет от fsck в случае чего, позволяет использовать вкусности типа снэпшотов, сжатия, возможности легко переехать на флешку большего объема.
Установка на zfs ничем особенным от wiki не отличается. Разве что я ставил не с инсталяционного диска, а вставил флешку в ноут, всё разметил и потом сделал
make installkernel installworld distribution DESTDIR=/zusb
Сейчас используется флешка на 4GB. Пока запас еще есть:
# zpool list
NAME   SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
zusb  3.59G  2.17G  1.43G    60%  ONLINE  -
# zfs list -oname,mountpoint,used,compressratio   
NAME                      MOUNTPOINT             USED  RATIO
zusb                      legacy                2.17G  1.34x
zusb/jail                 /jail                  422M  1.03x
zusb/jail/int             /jail/int              422M  1.03x
zusb/jail/int/tmp         /jail/int/tmp           30K  1.00x
zusb/jail/int/usr         /jail/int/usr          349M  1.00x
zusb/jail/int/var         /jail/int/var         52.7M  1.31x
zusb/jail/int/var/db      /jail/int/var/db      52.0M  1.29x
zusb/jail/int/var/db/pkg  /jail/int/var/db/pkg  26.6M  1.57x
zusb/jail/int/var/empty   /jail/int/var/empty     21K  1.00x
zusb/jail/int/var/log     /jail/int/var/log      446K  3.74x
zusb/jail/int/var/mail    /jail/int/var/mail      21K  1.00x
zusb/jail/int/var/run     /jail/int/var/run       31K  1.00x
zusb/jail/int/var/tmp     /jail/int/var/tmp       23K  1.00x
zusb/tmp                  /tmp                   243K  1.00x
zusb/usr                  /usr                  1.46G  1.49x
zusb/usr/home             /usr/home              353K  1.87x
zusb/usr/local            /usr/local             576M  1.04x
zusb/usr/ports            /usr/ports             415M  1.45x
zusb/usr/ports/distfiles  /usr/ports/distfiles   121M  1.00x
zusb/usr/ports/packages   /usr/ports/packages   61.8M  1.00x
zusb/usr/src              /usr/src               234M  3.24x
zusb/var                  /var                  39.3M  1.73x
zusb/var/db               /var/db               35.0M  1.36x
zusb/var/db/pkg           /var/db/pkg           6.95M  2.94x
zusb/var/empty            /var/empty              21K  1.00x
zusb/var/log              /var/log              2.96M  6.57x
zusb/var/mail             /var/mail               59K  1.00x
zusb/var/run              /var/run               587K  1.00x
zusb/var/tmp              /var/tmp               138K  1.00x
Как видно compression тоже дает какой-то эфект.
Светящийся тут jail это неудачная попытка запустить иксы в jail: изначально была идея что так как компьютер планируется использовать одновременно и для внутренних нужд (htpc), и для внешних (router и torrent клиент), то завести два отдельных jail-а: внутренний и внешний, и тем самым обеспечить невозможность засветить внутренние сервиса на внешний ip и ограничить что именно светить наружу. Но в таком виде идея провалилась, поэтому будет реализована в немного видоизмененной.
Это установленная базовая система фактически без оптимизации (только удалены /boot/kernel/*.symbols), Xorg, mplayer, nvidia-driver, openbox и всё, чего оно захотело:
# pkg_info|wc -l
     216
Оборудование в среднем распознается без проблем:
# pciconf -lv
...
ohci0@pci0:0:4:0:       class=0x0c0310 card=0x83e21043 chip=0x0aa510de rev=0xb1 hdr=0x00
    vendor     = 'NVIDIA Corporation'
    class      = serial bus
    subclass   = USB
ehci0@pci0:0:4:1:       class=0x0c0320 card=0x83e21043 chip=0x0aa610de rev=0xb1 hdr=0x00
    vendor     = 'NVIDIA Corporation'
    class      = serial bus
    subclass   = USB
ohci1@pci0:0:6:0:       class=0x0c0310 card=0x83e21043 chip=0x0aa710de rev=0xb1 hdr=0x00
    vendor     = 'NVIDIA Corporation'
    class      = serial bus
    subclass   = USB
ehci1@pci0:0:6:1:       class=0x0c0320 card=0x83e21043 chip=0x0aa910de rev=0xb1 hdr=0x00
    vendor     = 'NVIDIA Corporation'
    class      = serial bus
    subclass   = USB
hdac0@pci0:0:8:0:       class=0x040300 card=0x84271043 chip=0x0ac010de rev=0xb1 hdr=0x00
    vendor     = 'NVIDIA Corporation'
    class      = multimedia
    subclass   = HDA
ahci0@pci0:0:11:0:      class=0x010601 card=0x83e21043 chip=0x0ab810de rev=0xb1 hdr=0x00
    vendor     = 'NVIDIA Corporation'
    device     = 'MCP79 AHCI1 (MCP79)'
    class      = mass storage
    subclass   = SATA
vgapci0@pci0:3:0:0:     class=0x030000 card=0x83e21043 chip=0x087d10de rev=0xb1 hdr=0x00
    vendor     = 'NVIDIA Corporation'
    class      = display
    subclass   = VGA
re0@pci0:4:0:0: class=0x020000 card=0x83a31043 chip=0x816810ec rev=0x03 hdr=0x00
    vendor     = 'Realtek Semiconductor'
    device     = 'Gigabit Ethernet NIC(NDIS 6.0) (RTL8168/8111/8111c)'
    class      = network
    subclass   = ethernet
...
# cat /dev/sndstat 
FreeBSD Audio Driver (newpcm: 64bit 2009061500/amd64)
Installed devices:
pcm0: <hda Realtek ALC887 PCM #0 Analog> (play/rec)
pcm1: <hda Realtek ALC887 PCM #1 Analog> (play/rec)
pcm2: <hda Realtek ALC887 PCM #2 Digital> (play) default
pcm3: <hda NVidia MCP7A HDMI PCM #0 Digital> (play)
Процессор тоже вполне настоящий:
CPU: Intel(R) Atom(TM) CPU  330   @ 1.60GHz (1600.03-MHz K8-class CPU)
  Origin = "GenuineIntel"  Id = 0x106c2  Family = 6  Model = 1c  Stepping = 2
  Features=0xbfe9fbff
  Features2=0x40e31d
  AMD Features=0x20100800
  AMD Features2=0x1
  TSC: P-state invariant
real memory  = 4294967296 (4096 MB)
Physical memory chunk(s):
0x0000000000001000 - 0x0000000000047fff, 290816 bytes (71 pages)
0x0000000000058000 - 0x000000000009afff, 274432 bytes (67 pages)
0x0000000001bbb000 - 0x00000000c9d91fff, 3357372416 bytes (819671 pages)
avail memory = 3338301440 (3183 MB)
Event timer "LAPIC" frequency 0 Hz quality 500
ACPI APIC Table: <020110 APIC1033>
INTR: Adding local APIC 2 as a target
FreeBSD/SMP: Multiprocessor System Detected: 4 CPUs
FreeBSD/SMP: 1 package(s) x 2 core(s) x 2 HTT threads
 cpu0 (BSP): APIC ID:  0
 cpu1 (AP/HT): APIC ID:  1
 cpu2 (AP): APIC ID:  2
 cpu3 (AP/HT): APIC ID:  3
APIC: CPU 0 has ACPI ID 1
APIC: CPU 1 has ACPI ID 3
APIC: CPU 2 has ACPI ID 2
APIC: CPU 3 has ACPI ID 4
Есть кое-какая поддержка power management фичей:
# sysctl dev.cpu.0
dev.cpu.0.%desc: ACPI CPU
dev.cpu.0.%driver: cpu
dev.cpu.0.%location: handle=\_PR_.P001
dev.cpu.0.%pnpinfo: _HID=none _UID=0
dev.cpu.0.%parent: acpi0
dev.cpu.0.temperature: 56.0C
dev.cpu.0.freq: 1600
dev.cpu.0.freq_levels: 1600/-1 1400/-1 1200/-1 1000/-1 800/-1 600/-1 400/-1 200/-1
dev.cpu.0.cx_supported: C1/0 C2/1 C3/85
dev.cpu.0.cx_lowest: C1
dev.cpu.0.cx_usage: 100.00% 0.00% 0.00% last 279us
Процессор поддерживает C3, но включение его вызывает очень сильное падение производительности (дождаться даже установки пекеджа становится проблематично). Всё уменьшение частоты исключительно через acpi throttle. Поэтому, а так же потому, что за всё время наблюдений я не видел чтобы температура процессора доходила хотя бы до 65C, я не включал никаких power management функций.
Видеокарта нормально распозналась X -configure:
Section "Device"
        Identifier  "Card0"
        Driver      "nvidia"
        VendorName  "nVidia Corporation"
        BoardName   "G98 [GeForce 9300M GS]"
EndSection
На подключенный по hdmi телевизор тоже картинка сходу пошла, только не захотел сам выставить максимальное разрешение. Но кручение через nvidia-settings с последующим переносом настроек в xorg.conf всё полечило.
Да, на current драйвер nvidia надо ставить последний с сайта nvidia (у меня это 256.44), а не то, что сейчас в портах. Для быстрой и удобной установки можно просто немного поправить порт: поменять в нём DISTVERSION , после чего make makesum && make install clean .
Звук по hdmi передаваться не захотел. Кто виноват: видеокарта или драйер, я не знаю и пока не разбирался, а просто подключил акустику по оптическому кабелю в spdif. Но вообще звук по hdmi с nvidia под freebsd передается: я сам это проверял на своём ноуте как только вышли драйвера nvidia под freebsd amd64.
Как обычно все аудиовыходы (задние штекеры, фронтальные, spdif, звук на hdma) представлены в виде разных pcm устройств (я выше показывал). Несколько раз видел что людей такое смущает: они удивляются откуда на их компьютере (а особенно если это ноутбук) две звуковых карта, да еще и разных производителей. А вообще благодаря этому можно выбирать куда выводить звук или явно указывая программые нужный /dev/pcm , или выставив для всех hw.snd.default_unit .
Ну и, собственно, самое главное на данный момент: проигрывание hd видео. Для этого нужно собрать mplayer с поддержкой vdpau , прописать ему вот такой конфиг:
# cat .mplayer/config 
vo=vdpau
vc=ffh264vdpau,ffmpeg12vdpau,
ac=hwac3,a52,
и спокойно смотреть видео на прохлаждающемся процессоре:
PID USERNAME    THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
73587 levsha        1  49    0   215M 40660K nanslp  2   0:15  8.98% mplayer
Теперь о планах. Планируется прикрутить IR, перенести аудиоплеер на медиабокс, сделав на ноутбуке управление им хоткеями, поднять torrent client (посматриваю на transmission), спортироать xbmc, возможно поиграться с DLNA.

субота, 7 серпня 2010 р.

mutt & imap

В mutt есть поддержка imap, вполне себе рабочая. Но есть некоторые нюансы:
  • нет offline mode (хотя письма mutt и кеширует)
  • синхронизация прочитанных/удаленных писем делается не сразу по прочтению/удалению, а по нажатию специальной клавиши или по переходу в другую папку. И если к моменту синхронизации связь с сервером оборвалась, то информация, которую нужно засинхронизировать, просто теряется
Отказываться от imap полностью и переходить на fetchmail не хочется: теряется возможность читать почту с телефона и через webmail.
Возвращаться к чтению почты в mutt прямо на сервере тоже не хочется: в своё время я ушел от этого потому, что не хочу держать свой pgp ключ на сервере и заниматься поддержкой pgp database на сервере. Да и опять же хочется иметь offline mode.
Решением всего этого стало использование программы offlineimap: запущенная программа периодически синхронизирует imap ящик с локальным maildir, mutt работает со своим любимым локальным maildir. Настройка offlineimap и mutt есть в offlineimap faq.

пʼятниця, 6 серпня 2010 р.

Хозяйке на заметку: если у вас usb не в ядре, а модулями

... то не забывайте подгружать usb_quirk.ko . По умолчанию он не прописан в module_depend у других usb модулей, а в модулях стоит заглушка: если usb_quirk нету то считаем что нету никаких квирков.
К владельцам ядер с включенным в ядро usb это не относится.
Ликбез: quirk-ки содержат описание причуд некоторых некоторых моделей некоторого оборудования: "это оборудование не поддерживает комманду SYNCHRONIZE CACHE", "это оборудование должно обрабатываться драйвером ugen, хотя оно рапортует про себя что оно uhid" и т.п.

четвер, 1 липня 2010 р.

copy-paste между компом и мобилкой

Задача: скопировать какой-то текст (допустим url) c компьютера на мобилку. Как её будет решать обычный человек? Правильно - вручную перенаберет. Просто и терпимо по скорости.
Как его будет решать помешанний типа меня? Погуглит, найдет что то, что надо, называется QR Code, установит соответствующую утилитку, потом на компе сделает

qrencode -o- http://blog.levsha.me |xv -

а на мобилке запустит QR Code/barcode scanner и сосканирует эту картинку :)
P.S. Сотрудник, которому было продемонстрировано таку методику copy-paste, сказал "наконец то я буду знать зачем в телефоне нужна камера"

неділя, 16 травня 2010 р.

zfs only system & geom_eli

Непосредственно с geom_eli грузиться нельзя: ни loader, ни никакой из boot-ов его не умеют и загрузить ядро оттуда не смогут. Поэтому делается схема с /boot на отдельном разделе, без geli.
Вообще для этого можно практически дословно вспользоваться инструкцией http://wiki.freebsd.org/RootOnZFS/UFSBoot , но наличие дополнительного ufs раздела мне не нравится: это fsck после unclean shutdown, отсутствие дешевых снапшотов (к хорошему привыкаешь быстро). Поэтому была взята за основу эта статья, http://wiki.freebsd.org/RootOnZFS/GPTZFSBoot и вместе творчески доработаны до получения конфигурации с двумя zfs pool.
# gpart show ada0
=>       34  976773101  ada0  GPT  (466G)
         34         30        - free -  (15K)
         64        128     1  freebsd-boot  (64K)
        192       1856        - free -  (928K)
       2048   16777216     2  freebsd-swap  (8.0G)
   16779264    2097152     3  freebsd-zfs  (1.0G)
   18876416  957896719     4  freebsd-zfs  (457G)
Тут опять напоминаю владельцам дисков WesternDigital о желательности выравнивания начала разделов по 4K границе (gpart сам этого не делает).
swap в принципе может размещаться на zpool, но при этом не будет возможности получить crash dump ядра.
Понятно что на ada0 надо накатить pmbr и gptzfsboot
На 3-й раздел я повесил gpt label zboot для удобства. Использовать метку на 4-м разделе не получится: он должен быть размечен через geli с -b , а при этом ядро как только увидит geli label на ada0p4 , так сразу и запросит для него пароль, не зависимо от наличия gpt label
# geli list
Geom name: ada0p4.eli
EncryptionAlgorithm: AES-CBC
KeyLength: 128
Crypto: software
UsedKey: 0
Flags: BOOT
Providers:
1. Name: ada0p4.eli
   Mediasize: 490443119616 (457G)
   Sectorsize: 512
   Mode: r1w1e1
Consumers:
1. Name: ada0p4
   Mediasize: 490443120128 (457G)
   Sectorsize: 512
   Mode: r1w1e1
Кстати geli label содержит определенные метаданные, без которых получить данные с раздела не возможно. Поэтому не забывайте о необходимости сохранить их с помощью чего-нибудь типа
# geli backup ada0p4 /boot/geli.meta
Ну а дальше можно создавать два пула:
# zpool status
  pool: zboot
 state: ONLINE
 scrub: none requested
config:

        NAME         STATE     READ WRITE CKSUM
        zboot        ONLINE       0     0     0
          gpt/zboot  ONLINE       0     0     0

errors: No known data errors

  pool: zdata
 state: ONLINE
 scrub: none requested
config:

        NAME          STATE     READ WRITE CKSUM
        zdata         ONLINE       0     0     0
          ada0p4.eli  ONLINE       0     0     0

errors: No known data errors
# zpool get bootfs zboot
NAME   PROPERTY  VALUE   SOURCE
zboot  bootfs    zboot   local
# zpool get bootfs zdata
NAME   PROPERTY  VALUE   SOURCE
zdata  bootfs    -       default
# zfs list -o name,mountpoint zboot
NAME   MOUNTPOINT
zboot  /zboot
# zfs list -o name,mountpoint,exec,compression -r zdata
NAME                       MOUNTPOINT            EXEC  COMPRESS
zdata                      legacy                  on       off
zdata/usr                  /usr                    on       off
zdata/usr/home             /usr/home               on       off
zdata/usr/local            /usr/local              on       off
zdata/usr/local/arch       /usr/local/arch         on      lzjb
zdata/usr/local/jails      /usr/local/jails        on       off
zdata/usr/local/tinderbox  /usr/local/tinderbox    on       off
zdata/usr/ports            /usr/ports              on      lzjb
zdata/usr/ports/distfiles  /usr/ports/distfiles   off       off
zdata/usr/ports/packages   /usr/ports/packages    off       off
zdata/usr/src              /usr/src               off      lzjb
zdata/var                  /var                    on       off
zdata/var/crash            /var/crash             off      lzjb
zdata/var/db               /var/db                off       off
zdata/var/db/pkg           /var/db/pkg             on      lzjb
zdata/var/empty            /var/empty             off       off
zdata/var/log              /var/log               off      lzjb
zdata/var/mail             /var/mail              off      gzip
zdata/var/run              /var/run               off       off
zdata/var/tmp              /var/tmp                on      lzjb
# ls -l /boot
lrwxr-xr-x  1 root  wheel  11 12 кві 18:30 /boot -> /zboot/boot
# fgrep zfs /boot/loader.conf
zfs_load="YES"
vfs.root.mountfrom="zfs:zdata"
vfs.zfs.debug=1
#
# cat /etc/fstab
# Device   Mountpoint      FStype  Options         Dump    Pass#
/dev/gpt/swap   none            swap    sw      0       0       0
tmpfs   /tmp    tmpfs   rw,size=3221225472      0       0
proc    /proc   procfs  rw      0       0
fdescfs /dev/fd fdescfs rw 0 0
linproc /usr/compat/linux/proc  linprocfs       rw,late 0       0
/dev/cd0                /cdrom          cd9660  ro,noauto,-CKOI8-U      0       0
Вот так оно и живет на моем ноутбуке. Уже больше месяца как.

середа, 12 травня 2010 р.

zpool on whoole disk or not?

zfs в своих метках, которые он сохраняет на все диски, входящие в zpool, зачем-то сохраняет имена vdev-ов, из которых он состоит. Зачем он там делает не понятно, ввиду того, что все-равно сохраняются и всегда проверяются еще и GUID-ы дисков. Наверное так делается для усложнения жизни.
На solaris оно вроде как не должно быть ничем страшно ввиду того, что там диски обзываются согласно их расположению. А вот на FreeBSD это чревато проблема в случае, когда съедет нумераци дисков (а она обязательно съедет после ребута с отвалившимся диском)
Оно то вроде и не особо страшно: zfs export && zfs improt и всё снова работает. Но все-равно дополнительные действия (а как поступать в случае zfs only system я вообще не представляю). Поэтому лучше таки так не делать.
Из обдуманых и нарытых в инете советов я дла себя выбрал создание одного большого GPT раздела с gpt меткой: по сравнение с glabel гарантия что не возникнет непоняток из-за вдруг обнаруженных в начале диска zfs меток, и вроде как более переносимо (теоретически, а говорят даже практически существует возможность импортировать в solaris pool, экспортированный из FreeBSD).
Кстати при разметке WD дисков сразу рекомендую не забывать про 4K сектора: gpart для GPT по умолчанию предлагает начинать раздел с 34-го 512B сектора, чего явно делать не стоит.

середа, 5 травня 2010 р.

Пляски с ZFS

Из цитат на #freebsd@RusNet:
zfs = оно то вроде работает, но если/когда она развалится, то что с ней делать не понятно вообще (c) levsha.
fsck не нужен, потому что не поможет (c) kib
"Вот наконец настал тот час", и zfs у меня поломался.
На сервере отвалился один диск (не из того пула, который потом сломался, а из другого). Но это отваливание как-то серьезно переклинило контроллер (да, adaptec говно), и посыпалась куча таймаутов от контроллера.
Полностью выключил сервер, подождал некоторое время и включил. В результате после загрузки получил панику. Попробовал удалить /boot/zfs/zpool.cache . В результате пулы перестали автоматически подключаться (совершенно справедливо) и стали видны по zpool import. При этом нужный пул стал помечен UNAVAILABLE, хотя он состял из одного raidz из 6 дисков, причем и raidz и все 6 дисков отображались как ONLINE.
Для ковыряний попробовал использовать zdb. Он при попытке запуска на пул падал по segmentation fault. Это оказалось плюсом: zdb использует тот же код, что и zfs.ko, но на user level, что, впервых, дает core dump вместо panic, во вторых позовляет использовать обычный gdb.
Ковыряния кода с помощью gdb показали, что где-то в душе вызывается zio_vdev_io_start() с zio->io_vd == NULL . Где и почему это происходит я не нашел. При этом zio_vdev_io_start считает что может справиться с такой ситуацией:
if (vd == NULL) {
if (!(zio->io_flags & ZIO_FLAG_CONFIG_WRITER))
spa_config_enter(spa, SCL_ZIO, zio, RW_READER);

/*
* The mirror_ops handle multiple DVAs in a single BP.
*/
return (vdev_mirror_ops.vdev_op_io_start(zio));
}
Вот только vdev_op_io_start совершенно не приспособлен до такой ситуаци: он в конце концов вызывает вот такую функцию:
boolean_t
vdev_is_dead(vdev_t *vd)
{
return (vd->vdev_state < VDEV_STATE_DEGRADED); }





за что сразу получает по голове (или sigsgev в случае zdb, или panic в случае zfs.ko).
Простенький патч вида
Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
===================================================================
--- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c (revision 207555)
+++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c (working copy)
@@ -1845,6 +1845,10 @@
boolean_t
vdev_is_dead(vdev_t *vd)
{
+ if( vd == NULL ){
+ printf("XXX: Attemt to call vdev_is_dead for NULL vd\n");
+ return 1;
+ }
return (vd->vdev_state < VDEV_STATE_DEGRADED); }





панику исправил, вот только к работоспособности это не привело: теперь операции, которые проходили по этому коду, просто бесконечно долго ждали завершения io.
Дальнейшие ковыряния в направлении "а почему же этот пул помечается как UNAVALIABLE и что с этим можно сделать?" дали результатом такое: UNAVAILABLE пул считается тогда, когда zfs решил что некоторые устройства из пула недоступны, но не может определить какие именно. Для того, чтобы было возможно определить такую ситуацию, zfs записывает в каждый uberblock (The uberblock is similar to the superblock in UFS (c) ZFS On-Disk Specification) контрольную сумму идентификаторов всех устройств, входящих в пул. Поизучавши http://hub.opensolaris.org/bin/download/Community+Group+zfs/docs/ondiskformat0822.pdf была накалякана вот такая приблуда:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
#include <errno.h>

#define UBERBLOCK_MAGIC 0x00bab10c /* oo-ba-bloc! */
#define UBERBLOCK_SHIFT 10 /* up to 1K */

typedef struct dva {
uint64_t dva_word[2];
} dva_t;

typedef struct zio_cksum {
uint64_t zc_word[4];
} zio_cksum_t;

typedef struct blkptr {
dva_t blk_dva[3]; /* 128-bit Data Virtual Address */
uint64_t blk_prop; /* size, compression, type, etc */
uint64_t blk_pad[3]; /* Extra space for the future */
uint64_t blk_birth; /* transaction group at birth */
uint64_t blk_fill; /* fill count */
zio_cksum_t blk_cksum; /* 256-bit checksum */
} blkptr_t;

typedef struct uberblock {
uint64_t ub_magic; /* UBERBLOCK_MAGIC */
uint64_t ub_version; /* SPA_VERSION */
uint64_t ub_txg; /* txg of last sync */
uint64_t ub_guid_sum; /* sum of all vdev guids */
uint64_t ub_timestamp; /* UTC time of last sync */
blkptr_t ub_rootbp; /* MOS objset_phys_t */
} uberblock_t;

int main(int argc, char* argv[]){

uberblock_t* ub = malloc(sizeof ub);
int res;

while( (res = read(0, ub, sizeof *ub) ) > 0 ){
if( ub->ub_magic != 0x00bab10c )
continue;
printf("ub_magic=%jx, ub_version=%ju, ub_txg=%ju, ub_guid_sum=%ju, ub_timestamp=%ju\n",
ub->ub_magic, ub->ub_version, ub->ub_txg, ub->ub_guid_sum, ub->ub_timestamp);

}
if( res < 0 ){ fprintf(stderr, "read(): %d\n", errno); } free(ub); return 0; }





На stdin пограммы были скормлены dd if=(тут перебираем все диски) bs=128k count=1 skip=(тут перебираем 1,3, последний и предпоследний блок на диске) . С блоками так потому, что zfs записывает на каждый диск 4 vdev label: две в начале и две в конце, и каждая vdev label заниает 256KBytes, из которых вторая половина это uberblocks array.
В моём случае было обнаружено что на нулевом диске несколько последних uberblock-ов содержат другую ub_guid_sum. Поэтому этот диск был просто вытянут, после чего zfs спокойно распознала этот пул.
Вот такое вот шаманство этот zfs...

неділя, 7 лютого 2010 р.

Переключение раскладок

Наконец то нашел то, чего давно хотел: включение нужной раскладки клавиатуры по определенной комбинации клавиш (это когда раскладки не переключаются по кругу, а при нажатии определенной клавишы/комбинации сразу включается английска, другой - русская, третей - украинская). Это может показаться не удобным на первый взгляд, но на самом деле это просто не привычно. В то же время по правилам построения интерфейсов это более правильно. Потому что задача то и есть "включить такую то раскладку", а не "включить раскладку на 2 вперед от текущей". И попытка её решения круговым переключением хуже тем, что нужно смотреть а какая раскладка сейчас включилась, вместо того, чтобы просто включить нужную, не зависимо от текущей.
Делал по заметке с хабрахабра: http://habrahabr.ru/blogs/linux/83223/

середа, 27 січня 2010 р.

Ethernet <->Wi-Fi failover

Простой случай: у вас есть одна сеть, доступная и по витой паре, и по wi-fi (очень распостраненная ситуация дома, а иногда и на некоторых фирмах). Хочется в случае подключения к витой паре работать через неё (чтобы быстрее), в случае отключения работать через wi-fi (для мобильности). Делается элементарно:
rc.conf:
#выставить на ethernet интерфейсе MAC с wifi интерфейса
# поднять оба интерфейса и запустить wpa_supplicant на wifi линке
ifconfig_em0="ether 00:16:ed:5d:6a:38 up"
wlans_iwn0="wlan0"
ifconfig_wlan0="WPA up"
# объединить линки
cloned_interfaces="lagg0"
ifconfig_lagg0="laggproto failover laggport em0 laggport wlan0 DHCP"

Сложный случай: есть разные сети, и только в некоторых из них wifi и ethernet это одна сеть, а в остальных разные. Тогда добавляем wlan0 в lagg только для сетей, которые мы явно указали.
rc.conf:
ifconfig_em0="ether 00:16:ed:5d:6a:38 up"
wlans_iwn0="wlan0"
ifconfig_wlan0="WPA DHCP"
cloned_interfaces="lagg0"
ifconfig_lagg0="laggproto failover laggport em0 wlan0 DHCP"
Находим и правим секцию в devd.conf:
notify 0 {
        match "system"          "IFNET";
        match "type"            "LINK_UP";
        media-type              "802.11";
        action "/etc/wlan_up.sh $subsystem";
};
Содержимое wlan_up.sh:
#!/bin/sh

subsystem=$1

laggether="`ifconfig lagg0 |awk '/ether/ {print \$2}'`"
wlanether="`ifconfig ${subsystem} |awk '/ether/ {print \$2}'`"
ssid="`ifconfig ${subsystem} |awk '/ssid/ {print \$2}'`"

if [ "x${laggether}" = "x${wlanether}" ]
then
        if [ "x${ssid}" = "xasus" ]
        then
                ifconfig lagg0 laggport ${subsystem}
                exit
        fi
fi

/etc/rc.d/dhclient quietstart $subsystem
В моём случае wlan добавляется в lagg только для ssid asus и только в случае, если MAC адрес wlan интерфейса и lagg интерфейса совпадает (это сделано для того, чтобы не добавлять в lagg другие wlan интерфейсы - я еще иногда подключал usb wlan карточку)

субота, 16 січня 2010 р.

Регулировка яркости в sony vaio

Работает! Оказывается надо всего лишь порыться в портах и нарисовать скриптик для того, чтобы в зависимости от текущей видеокарточки использовались разные программы:
#!/bin/sh

usage()
{
        echo "usage: $0 [value|+value|-value]" >&2
        exit 2
}

if [ $# -gt 1 ]
then
        usage
fi

ETC=/usr/local/etc/X11
if ( cmp -s ${ETC}/xorg.conf ${ETC}/xorg.conf.sony.intel )
then
        getcmd='xbacklight'
        setcmd='xbacklight -set '
        inccmd='xbacklight -inc '
        deccmd='xbacklight -dec '
else
        if [ $(id -u) -ne 0 ]
        then
                prefix='sudo '
        else
                prefix=''
        fi
        getcmd="${prefix}nvclock -i | awk '/Backlight/ {print \$3;}'"
        setcmd="${prefix}nvclock -S "
        inccmd="${prefix}nvclock -S +"
        deccmd="${prefix}nvclock -S -"
fi

if [ $# -eq 0 ]
then
        $getcmd
        exit
fi

case $1 in
[0-9]|[0-9][0-9]|100)
        ${setcmd}$1 
        ;;
+[0-9]|+[0-9][0-9])
        ${inccmd}${1#?}
        ;;
-[0-9]|-[0-9][0-9])
        ${deccmd}${1#?}
        ;;
*)
        usage
        ;;
esac
Теперь на минимальной яркости с выгруженным usb живет 4 часа.

четвер, 24 грудня 2009 р.

Новая клавиатура

На моем соневском очень удобная клавиатура, но очень уж характерная. В результате когда на работе набираю текст то на рабочей клавиатуре, то на ноутбуке, получается неудобно: после переключения с рабочей клавиатуры на ноутбучную некоторое время тарабаню по ней со всей дури. Поэтому практически с момента покупки ноутбука я искал себе подходящую по нажатию рабочую клавиатуру. Даже купил одну короткоходную, но оказалось совсем не то.
Практически такие же клавиатуры у маков. Я даже думал себе маковскую купить, но останавливало то, что в продаваемых у нас маковских клавиатурах Enter не горизонтальный (американский), а "ход конем" (английский), а в американских клавиатурах крайняя левая клавиша это какой-то ихний вариант Fn, а не Ctrl.
Летом как-то случайно увидел в магазине All in One компьютер от Sony, с которым шла беспроводная клавиатура точно такая, как надо. Но такие клавиатуры отдельно не продавались нигде (вообще нигде, не только в Украине).
И вот месяца 2 назад sony таки выпустил в продажу клавиатуру VGP-BKB1. Вот только в Украине о ней вообще не было (и до сих пор нет) никаких упоминаний, а в России есть только упоминания (но нет в наличии).
В результате подумав, посомневавшись, таки решился и заказал клавиатуру по интернету с доставкой со Штатов с оплатой по кредитке. Обошлось всё это дело в $147 - $83.75 сама клавиатура и $63.25 доставка со Штатов (почему-то дорогая доставка получилась). Да, сейчас нашел что в России на неё заявлена цена 4490 рублей (то есть те же $147, что я заплатил вместе с доставкой).
Заказ сделал 26-го ноября, 30 ноября магазин её отгрузил, 1 декабря она была отправлена мне из Бруклина. А дальше весело: судя по штампам на посылке в на моё отделение в Киеве она прибыла 9 декабря, а почта смогла донести мне в почтовый ящик уведомление о посылке аж 15-го декабря. То есть из Бруклина в Киев и полкилометра от почтового отделения до дома занимает практически одну и ту же неделю ;) Ну и еще на почте не смогли произвести кирилизацию моей фамилии, написанной на посылке транслитом, поэтому в уведомлении в поле "отримувач" написали просто "Микола". Когда забирал посылку то еще и пробовали возмущаться "как эти ваши американцы фамилии пишут что прочесть не возможно?", на что были посланы "фамилия написана точно так же, как и в загранпаспорте".
Вообще сами американцы очень хорошо относятся к почте и без всяческих сомнений доверяют им посылки. Об этом свидетельствует коробка:

Снизу это посылка, сверху это коробка с клавиатурой. Коробка с клавиатурой находилась внутри посылки, а все промежутки были заполнены запаяными целлофановыми пакетами.
Ну и вот как выглядит клавиатура на столе:

И в сравнении с ноутбуком:

Под freebsd завелась сходу с помощью bthidcontrol и последующего включения bthidd. Естественно до запуска bthidd она не работает, в связи с чем возник вопрос: а как на оригинальных компьютерах Sony заходят в биос с bt клавиатуры? Или там в efi прошыли поддержку bt клавиатуры?

четвер, 10 грудня 2009 р.

3G ExpressCard modem on FreeBSD

Итак, мною куплен HSDPA модем Novatel Merlin XU870. Под FreeBSD 9.x он без каких-либо вопросов распознался с помощью u3g(4):

Dec 10 16:00:29 laptop kernel: ugen5.2: at usbus5
Dec 10 16:00:29 laptop kernel: u3g0: on usbus5
Dec 10 16:00:29 laptop kernel: u3g0: Found 2 ports.

После втыкания появляются два порта: ttyU0.0 и ttyU0.1. Первый обычный AT порт, второй судя по всему порт для мониторинга и какого-то управления.
Через первый порт стандартно всё почти работает через ppp(8) обычными настройками как для мобилки. "Почти" потому, что umc додумался выдавать адреса на концы туннеля в стиле 95.109.188.33 -> 0.0.0.0 . В принципе вполне рабочая конструкция, но ppp офигевает от такого, ругается что не может выставить адреса на tun интерфейс и всё сваливается. Поэтому немного покопался и настроил через mpd.
В mpd всё получилось достаточно просто вот такой секцией в mpd.conf

hypernet:
create link static LHP modem
set modem device /dev/cuaU0.0
set modem watch -cd
set modem var $APN "hyper.net"
set modem script DialGprs
set link disable chap pap
set link accept chap pap
set link action bundle BHP
create bundle static BHP
set bundle links LHP
set iface addrs 0.0.0.0 !10.253.252.251
set iface route default

Плюс еще поправил штатный mpd.scripts: была добавлена секция

DialGprs:
set $DialPrefix "DT"
set $Telephone "*99#"
goto DialPeer

(хотя не думаю что это правильный метод - это можно было и в mpd.conf вынести), и добавлено определение и инициализация модема: после строки print "ATI\r\n" была добавлена строка match "+CGSM" ModemIdentGSM и описана Ident секция:

ModemIdentGSM:
set $ModemDescription "GSM modem"
set $ModemIsAnalog "no"
set $ModemSetupFunc GsmSetup
return
...
GsmSetup:
set $Baundrate 921600
set $modemCmd "+CGDCONT=1,\"IP\",\"${APN}\",\"0.0.0.0\",0,0"
call ModemCmd2
return

Всё работает вполне чётко и стабильно.
С рюшечками пока ничего нет: umtsmon достаточно быстро собрал под фрей, но работать он пока не захотел. Так что с ним еще буду разбираться