середу, 25 серпня 2010 р.

Софт для android: FBReader

Как всегда на высоте. Дневной/ночной режим, очень мелкий шаг подстройки размера шрифта, пролистывание чем угодно, включая кнопки громкости, фиксация вертикального/горизонтального положения.
В общем как и на других мобильных платформах лучшая читалка книжек. Рекомендую

вівторок, 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.

четвер, 12 серпня 2010 р.

htpc & nas & router своими руками

Долгое время я был поклонником домашних железок, которые выполняют свой достаточно узкий набор функций, но "just works".
В частности, этими железками были:
  • Asus wl-500GP v2:


    Один из самых функциональных soho роутеров после заливки на него альтернативной прошивки (я использовал dd-wrt)
  • Popcorn hour A-110:


    В своё время практически первый hd плеер, который стоил вменяемых денег и при этом играл практически всё, что содержит видео: любые mkv, iso образы, содержащие dvd/hd-dvd/bd, просто сброшенную на файловую систему структуру с dvd диска и т.п. В дополнение ко всему этому плеер сам прекрасно тягал с инета торренты с этими фильмами.
Но ситуация изменилась.
В связи с переездом и сменой интернет-провайдера с ethernet-домонета на adsl asus пришлось заменить на уже имевшийся у меня Linksys WAG-200 - adsl роутер со встроенным свичем и wifi AP. Железка не самая дешевая, но при этом оказавшаяся страшно глупой: из вещей, которые хотелось бы иметь, нет приоритезации трафика, нет static leases в dhcp сервере.
popcorn стал виснуть на закачке torrent файлов. То ли какое-то обновление ему не понравилось, то ли резко похудавший канал, то ли еще чего. Кроме того он и раньше иногда вис на сильно сложных файлах. И таки не играл некоторые файлы.
Захотелось иметь не просто карман, в который легко вставляются диски (как сейчас), а какой-то более серьезный NAS для файлов, с резервированием и всё такое.
Так начала зреть идея собрать домой системный блок, который и будет выполнять все эти функции. Но при этом ставить обычный системних не хотелось: большой, возможно еще и шумный, совсем не подходящий по виду. Поэтому неспешно рассматривались варианты на базе mini-ITX платы.
Рассматривались долго: все попадавшиеся на глаза корпуса или выглядели страшно, или были рассчитаны на установку только одного жетского диска (часто еще и 2.5"). Пока не подсказали вот такой вариант:


Вот с покупки этого корпуса и началась вся сборка. Корпус называется Chenbro ES34169, рассчитан под установку mini-ITX материнки, имеет 4 hot swap отсека под 3.5" диски. На морде стоит кардридер по SD и MS, 2 USB разъема (и то и то внутри корпуса подключается кабелем на usb разъемы материнской платы). Еще на морде есть окошко под установку IR приёмника. Вообще было бы логично увидеть там уже установленный приёмник (особенно с учетом немалой цены корпуса), но chenbro решили иначе... Морда закрывается полупрозрачной крышкой на петлях и магнитых защелках, что очень кстати: светодиоды при открытой крышке светят сильно ярко, а вот через закрытую свет становится на уровне "видно если специально посмотреть на корпус".
В задней части стоят два вентилятора, которые продувают блок питания и карманы с дисками. Специального продува для остека с материнской платой нет (вероятно считается что это уже заботы системы охлаждения самой материнки). Если подключать вентиляторы напрямую к БП (на одном из кабелей питания, идущих из БП, есть специальные разъемы для этого), то они будут работать на полных оборотах. При этом они шумят. Не так чтобы очень громко (где-то на уровне обычного офисного системного блока), но для домашней машинки хочется тише. Решение простое: вентиляторы нужно подключить на разъемы на материнской плате, после чего в bios setup включить fan control. bios сразу снижает обороты вентиляторов практически вдвое, что очень благоприятно сказывается на уровне шума. На практике решение оказалось не очень то и простым: только один кабель без проблем доставал к разъему на материнской плате. Сначала подумывал купить где-нибудь на ebay удлиннитель, но потом обошелся без него: вентилятор с недостающим питанием был откручен, повернут на 180 градусов (по оси вращения) чтобы выход кабеля стал смотреть в другую сторону, после чего кабель питания был запущен с другой стороны перегородки в отсек материнской платы.
При этих всех манипуляциях обнаружился момент с выходами под вентиляторы на плате. Их три: cpu, chassis и power. Частота вращения снимается для всех трех, но регулируется только для двух первых. Поэтому корпусные вентиляторы были повешены на cpu и chassis.
Выбор mini-ITX плат сейчас на первый взгляд большой, но на практике очень легко отсевается большинство из них. Естественно сразу отбрасываются все с впаянным celeron. Туда же идут все на базе atom с интегрированной графикой от intel - они не потянут full hd. В результате остаются платы на base nvidia ion и платы под socket 775 и socket 1156. Варианты с socket 1156, конечно, интересны. Но вот только в корпусе БП на 120Wt, а у Core i3/i5 согласно intel.com TDP 72Wt. А ведь надо еще питать саму материнку и 4 диска. Да и отводить эти 72Wt надо будет. socket 775 не хочется тоже из-за подозрений с питанием и теплоотводом. Да и вариантов на нём мало, и те часто на интеловской интегрированной графике. Кроме того необходимо наличие 4-х SATA разъемов на материнке (а zotac любит делать 3, судя по всему жертвуя четвертый на eSATA). Итого остаются платы на базе atom 330 и чипсета nvidia ION с интегрированной в него графикой GeForce 9300M GS. Из них часть опять же бракуется по отсутствию 4-х SATA.
В результате я выбрал Asus AT3IONT-I:


Плата обладает полностью пассивным охлаждением чипсета и процессора, 2-мя слотами под DDR3 память (куда сразу было куплено 2 планки по 2GB), PCIe x16 слотом, разъемом rs232 на плате. Остальной набор портов достаточно стандартен: gigabit ethernet, куча usb, еще есть ps/2 для клавиатуры, аналоговый и цифровой оптический выход звука, vga и hdmi (DVI нет, но мне не нужен, а кому надо, те могут купить кабель-переходник hdmi - dvi-d). Из установленных 4GB оперативной памяти системой видится только 3GB: об этом явно сказано в документации на материнску плату (особенности то ли чипсета, то ли процессора). На плате (в отличие от некоторых zotac) нету wifi, но мне не надо (планирую оставить внешний), а если надо будет, то можно будет поставить в PCIe.
Итак, всё это собрано, минимально настроена операционка, гонялось тестовое видео. full hd видео с применением VDPAU идет без каких-либо проблем. При этом загрузка процессора не доходит до 10%. Никаких настроек по экономии питания в операционке не делалось. Но при этом всём температура проессора всегда держится в пределах 55-60C (максимум, что видел, это 62C).
Из возможно hardware проблем пока есть только отсутствие звука на hdmi выходе. Но скорее всего виноват драйвер. Так что звук пока пустил по оптическому цифровому выходу.
Цену всего этого писать не буду: смотрите сами в ваших локальных прайсах.
Про установку и настройку системы опишу отдельно.

суботу, 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" и т.п.